home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 34.zip
/
BS1 part 34
/
GFA basic training.adf
/
SpriteEditor
/
SPRITEEDITOR.LST
< prev
Wrap
File List
|
1989-06-01
|
24KB
|
796 lines
~FRE(0) ! Dummy zur Garbage Collection
' Spriteeditor V1.8 vom 20.02.89 von Thomas Knab
' für das Buch-Kapitel SpriteED und Programmoptimierung des Buches
' "GFA-Basic V3.0 Programmierung auf AMIGA"
' Incl. Copy, Spiegel, Auf- Abwärts-Ausschnitten, Rechts-Links-Rollen, 4 Farben,
' und 26-Bilder-Animation. Spritegrösse: 16x32 Pixel
' Bit-Scan Routinen optimiert von Frank Ostrowski 15.02.89
' Das Kopf- und Hauptprogramm:
@initdim
@bildauf
@editor_maske
' Initialisierung Ende und Hauptschleife:
REPEAT
@haupt_verzweigung
UNTIL exit|=1
' Ende des Programms und Speicherfreigabe:
@bildzu
END
' Routinen:
' Initialisierung von Arrays, Screen/Window auf- bzw.
' zumachen und Editor-Maske malen
> PROCEDURE initdim
' Komplette Sprite Animation - 26 Slots
DIM ani_spr$(25)
' Je eine Spritezeile als String und als Langwortvariable
DIM edit_spr$(31)
DIM spr_zeile%(31)
' Blitter-Farbblöcke für GET und PUT:
DIM a$(3),aa%(2)
' 3 User Farben
DIM color&(2)
'
' Alle Spritefelder mit Null füllen (sonst "SPRITEFEHLER")
FOR i|=0 TO 25
ani_spr$(i|)=STRING$(128,0)
NEXT i|
copybuffer$=STRING$(128,0)
RETURN
> PROCEDURE bildauf
OPENS 1,0,0,320,256,3,&H4000 ! 8-Farben-Screen
SETWPEN 1,0 ! Titel als Normalschrift (nicht Revers!)
OPENW #1,0,0,320,256,0,&H1800,1 ! Fullwindow mit Activate
SETCOLOR 0,&H777 ! Anfangsfarben werden gesetzt
SETCOLOR 1,&H111
SETCOLOR 2,&H666
SETCOLOR 3,&H66
SETCOLOR 4,&H6
' Slider & Malfarbe setzen
SETCOLOR 5,&HF00
SETCOLOR 6,&HF0
SETCOLOR 7,&HF
TITLEW #1,"SpriteED:GFA-Basic V3.0 Programmierung"
COLOR 7,0
' Hier folgen die Quadrate für die verschiedenen Farben im Malraster
PBOX 11,11,17,17
GET 11,11,17,17,a$(3)
COLOR 6,0
PBOX 11,11,17,17
GET 11,11,17,17,a$(1)
COLOR 5,0
PBOX 11,11,17,17
GET 11,11,17,17,a$(2)
COLOR 0,1
PBOX 11,11,17,17
GET 11,11,17,17,a$(0)
aa%(0)=2
aa%(1)=1
aa%(2)=3
' Ausschnittsbox begrenzen
ausy|=29
ausy1|=47
COLOR 1,0 ! Malfarbe für Bildmaske setzen
RETURN
> PROCEDURE bildzu
SPRITE #2
SPRITE #3
SPRITE #4
SPRITE #6
CLOSEW #1
CLOSES 1
RETURN
> PROCEDURE editor_maske
' Das Malraster wird erstellt mit 16 Zeilen, 16 Spalten
FOR i|=0 TO 16
LINE 10,10+i|*8,138,10+i|*8
LINE 10+i|*8,10,10+i|*8,138
NEXT i|
' Das Transparent-BOB
GET 11,11,11+16*7,16,aaa$
' Spritebox zur Darstellung
TEXT 193,22,"Sprite:"
BOX 206,27,230,65
' Up-Down Scrollbox
BOX 208,29,228,47
TEXT 233,35,"Ausschnitts"
TEXT 233,44,"Startzeile:"
BOX 255,47,287,67
' Aktives Animations-Sprite & Darstellungsposition
TEXT 143,35,"Animate"
TEXT 143,43,"Slot Nr"
BOX 155,48,182,67
' Rollboxen rechts und links
TEXT 179,80,"L-Rollen-R"
BOX 177,72,187,82
BOX 249,72,260,82
' Aktive Slot-Nummer für Animation (Wahl)
' Dreieck für plus
LINE 175,128,192,118
DRAW TO 192,137
DRAW TO 175,128
' Texte für aktiven Slot
BOX 202,118,231,137
TEXT 193,114," Slot "
TEXT 183,130,"+"
TEXT 210,130,slot|
TEXT 243,130,"-"
' Dreieck für minus
LINE 257,128,240,118
DRAW TO 240,137
DRAW TO 257,128
' Die Farb-Sliderboxen
BOX 0,148,157,219
TEXT 15,146,"Farbeinstellung"
FOR i|=0 TO 2
' 3 Slider Boxen: Rot,Grün,Blau
' als Grundfarben
BOX 8,150+i|*20,138,166+i|*20
NEXT i|
TEXT 144,161,"R"
TEXT 144,181,"G"
TEXT 144,201,"B"
' Aktuelle Farbwahl-Boxen
TEXT 5,215,"Farben:"
BOX 63,208,73,217
' Auswahlmenü
FOR i|=0 TO 1
FOR j|=0 TO 2
BOX 160+i|*75,145+j|*15,235+i|*80,160+j|*15
NEXT j|
NEXT i|
TEXT 177,156,"CLEAR"
TEXT 257,156,"COPY"
TEXT 181,171,"LOAD"
TEXT 257,171,"SAVE"
TEXT 170,186,"ANIMATE"
TEXT 245,186,"SPIEGEL"
' EXIT Box
BOX 211,194,260,208
TEXT 220,204,"EXIT"
' USER-Nachrichten-Box
BOX 0,236,310,255
' Slider-Sprites setzen (Schieber)
sl_spr$=STRING$(56,&X11110000)
SPRITE #2,sl_spr$
SPRITE #3,sl_spr$
SPRITE #4,sl_spr$
SETCOLOR 23,&HBBB
SETCOLOR 27,&HBBB
color&(0)=&HF00
color&(1)=&HF0
color&(2)=&HF
SPRITE #6,ani_spr$(0)
SPRITE #6,210,31
rot_pos|=8
grÜn_pos|=8
blau_pos|=8
' Farbauswahl-Boxen setzen (Schwarz)
BOUNDARY 0
FOR i|=0 TO 2
COLOR (5+i|),0
PBOX 80+i|*17,209,88+i|*17,216
NEXT i|
COLOR 1,0
CLR aktive| ! Anfangswert für Selektion setzen
@zeig_farbboxwahl(aktive|)
@slidersetzen
RETURN
' Hauptverzweigung abhängig von Mausposition
> PROCEDURE haupt_verzweigung
IF MOUSEK ! Überhaupt eine Maustaste gedrückt ?
xm%=MOUSEX ! x-Position
ym%=MOUSEY ! y-Position
SELECT ym% ! nach y-Auswählen (1.Ast)
CASE 10 TO 139
' Diese 4 Proceduren haben direkte Aufgaben:
SELECT xm% ! nach x-Auswählen (1.Ast)
CASE 11 TO 137
IF ym%<138
@edit_raster ! Direkt verzweigen
ENDIF
CASE 176 TO 191
IF ym%>72 AND ym%<82
@roll_l ! Ebenfalls direkt verzweigen
ELSE IF ym%>118
@slot_inc ! Direkt verzweigen
ENDIF
CASE 196 TO 237
IF ym%>25 AND ym%<68
@auss_rauf_runter ! Nach Ausschnitt verzweigen
ELSE IF ym%>118
@wahl_slot_setzen ! Slot-Nummer direkt abfragen
ENDIF
CASE 241 TO 260
IF ym%>72 AND ym%<82
@roll_r ! Direkt verzweigen
ELSE IF ym%>118
@slot_dec ! Direkt verzweigen
ENDIF
ENDSELECT
CASE 150 TO 220 ! Nächste x-orientierte Auswahl (Bildschirmhälfte)
' Diese Prozedur wird ebenfalls direkt angesprungen:
SELECT xm%
CASE 6 TO 159
@farb_ed
' Diese zwei Proceduren verzweigen weiter:
CASE 161 TO 234
@menu_links
CASE 236 TO 319
@menu_rechts
ENDSELECT
ENDSELECT
' EXIT-BOX gedrückt ? => Sicherheitsabfrage
IF xm%>211 AND xm%<261 AND ym%>194 AND ym%<208
SPRITE #6,319,255
ALERT 0,"Sprite ED Verlassen ?",1,"JA,RAUS|ZURUECK",exit|
SPRITE #6,210,31
ENDIF
ENDIF
RETURN
' Weiterverzweigende Proceduren
> PROCEDURE menu_links
SELECT ym% ! Ebenfalls hier die schnelle SELECT-Abfrage
CASE 145 TO 160
' Clear ausgewählt und anspringen
@clear_sprite
CASE 160 TO 175
' Load gewählt und ebenfalls verzweigen
dk!=TRUE! ! Flag, ob laden oder saven
@disk(dk!)
CASE 175 TO 190
' Animate Selected und dorthin verzweigen
@animation
ENDSELECT
RETURN
> PROCEDURE menu_rechts
SELECT ym%
CASE 145 TO 160
' Copy Sprite ausgewählt
@sprite_copy
CASE 160 TO 175
' Speichern Sprites gewählt
dk!=FALSE!
@disk(dk!)
CASE 175 TO 190
' Spiegeln Sprite
@mirror
ENDSELECT
RETURN
' Eigentliche Hauptroutinen
' Direkte Proceduren
> PROCEDURE edit_raster
' Zeile ermitteln Mausposition-10 = Anfang des Rasters
' Division durch 8 (Raster-Abstand) ist gleich dem 'Bit-Shift-Rechts' 3 mal (2 hoch 3 = 8)
ypos|=SHR|(ym%-10,3)
' Spalte ermitteln (genauso wie oben)
xpos|=SHR|(xm%-10,3)
'
' Aktuellen Colorblock im Raster setzen
@block_setzen(aktive|,ypos|,xpos|)
'
' Werte dem Sprite-Slot übergeben abhängig von aktiver Farbe
Übergabe%=spr_zeile%(ypos|+z_start|)
SELECT aktive|
CASE 0
Übergabe%=BSET(Übergabe%,xpos|+16)
Übergabe%=BCLR(Übergabe%,xpos|)
CASE 1
Übergabe%=BCLR(Übergabe%,xpos|+16)
Übergabe%=BSET(Übergabe%,xpos|)
CASE 2
Übergabe%=BSET(Übergabe%,xpos|+16)
Übergabe%=BSET(Übergabe%,xpos|)
ENDSELECT
' Transparent ? dann alle Bits dieser Position löschen!
IF lÖsch!
Übergabe%=BCLR(Übergabe%,xpos|)
Übergabe%=BCLR(Übergabe%,xpos|+16)
ENDIF
spr_zeile%(ypos|+z_start|)=Übergabe%
@spiegeln(ypos|+z_start|)
' Jetzt sind die neuen Daten bereit zur Übergabe
' Es werden nur die veränderten Daten eingefügt:
MID$(ani_spr$(slot|),(ypos|+z_start|)*4+1)=MKL$(spiegel%)
' Spritefarbe setzen (nur Sprite #6):
SETCOLOR 29,color&(0)
SETCOLOR 30,color&(1)
SETCOLOR 31,color&(2)
SPRITE #6,ani_spr$(slot|)
SPRITE #6,210,31
RETURN
> PROCEDURE farb_ed
DO WHILE MOUSEK=1 ! In dieser Routine bleiben, solange der Mausknopf gedrückt ist
my%=MOUSEY
mx%=MOUSEX
' Farbeinstellung mit 3 interaktiven Slidern
SELECT my%
CASE 150 TO 166 ! Im Slider ROT ?
IF mx%>rot_pos|+8 AND mx%<=135 ! Vor der alten Position
ADD rot_pos|,8 ! Der oben erwähnte Achter-Schritt
ADD color&(aktive|),&H100 ! Farbwert erhöhen
SPRITE #2,MIN(rot_pos|,128),152 ! Neue Sliderposition setzen
ELSE IF mx%<rot_pos|-8 AND mx%=>3 ! hinter der alten Position
SUB rot_pos|,8
SUB color&(aktive|),&H100 ! Farbwert erniedrigen
SPRITE #2,rot_pos|,152 ! Neue Sliderposition
ENDIF
CASE 170 TO 186 ! Wie oben für GRÜN
IF mx%>grÜn_pos|+8 AND mx%<=135
ADD grÜn_pos|,8
ADD color&(aktive|),&H10
SPRITE #3,MIN(grÜn_pos|,128),172
ELSE IF mx%<grÜn_pos|-8 AND mx%=>3
SUB grÜn_pos|,8
SUB color&(aktive|),&H10
SPRITE #3,grÜn_pos|,172
ENDIF
CASE 190 TO 206 ! Und ebenfalls für Blau
IF mx%>blau_pos|+8 AND mx%<=135
ADD blau_pos|,8
INC color&(aktive|)
SPRITE #4,MIN(blau_pos|,128),192
ELSE IF mx%<blau_pos|-8 AND mx%=>3
SUB blau_pos|,8
DEC color&(aktive|)
SPRITE #4,blau_pos|,192
ENDIF
CASE 208 TO 220 ! Im Bereich der Farbboxwahl ?
SELECT mx%
' Farbboxwahl - Radio-Buttons
CASE 64 TO 72 ! Hintergrundfarbe
DEFLINE 0 ! Alten Rahmen löschen
@zeig_farbboxwahl(aktive|)
lÖsch!=TRUE! ! Löschflag setzen
CASE 81 TO 87 ! Farbe 1
DEFLINE 0
@zeig_farbboxwahl(aktive|)
aktive|=0 ! Farbnummer setzen für alle Routinen
DEFLINE 1
@zeig_farbboxwahl(aktive|)
@slidersetzen
lÖsch!=FALSE! ! Löschflag sicherheitshalber löschen
CASE 98 TO 104 ! Farbe 2
DEFLINE 0
@zeig_farbboxwahl(aktive|)
aktive|=1 ! Farbnummer setzen
DEFLINE 1
@zeig_farbboxwahl(aktive|)
@slidersetzen
lÖsch!=FALSE!
CASE 115 TO 121 ! Und Farbe 3
DEFLINE 0
@zeig_farbboxwahl(aktive|)
aktive|=2
DEFLINE 1
@zeig_farbboxwahl(aktive|)
@slidersetzen
lÖsch!=FALSE!
ENDSELECT
ENDSELECT
' Nun die aktuelle Farbe in Boxwahl & Sprite aktualisieren
@aktuellefarbe
' Keine Farbe setzen oder die Maustaste wurde losgelassen = Exit
LOOP UNTIL lÖsch!
RETURN
> PROCEDURE slot_inc
IF slot|<=24 ! Letzter Slot erreicht ?
farbex|=aktive| ! Aktive Farbe retten
INC slot| ! Slot hochzählen
TEXT 210,130," " ! Alte Nummer im Kasten löschen
TEXT 210,130,slot| ! Neue dort schreiben
SPRITE #6,ani_spr$(slot|) ! Sprite darstellen
@sprite_in_raster ! und ins Malraster übertragen
aktive|=farbex| ! Gerettete Farbe zurückschreiben
ENDIF
RETURN
> PROCEDURE slot_dec
IF slot| ! Nullter Slot erreicht ?
farbex|=aktive|
DEC slot| ! Slot runterzählen
TEXT 210,130," "
TEXT 210,130,slot|
SPRITE #6,ani_spr$(slot|)
@sprite_in_raster
aktive|=farbex|
ENDIF
RETURN
> PROCEDURE wahl_slot_setzen
TEXT 210,130," "
@nachricht_lÖschen
TEXT 10,248,"Slot # bitte ZWEISTELLIG eingeben "
REPEAT
@slot_taste_lesen
IF slot$>"2" ! Test auf Wertgrenze
@nachricht_lÖschen
TEXT 10,248,"Slot # nicht grösser als 2x ! "
ELSE
TEXT 210,130,slot$
ENDIF
UNTIL slot$>="0" AND slot$<"3"
slot1$=slot$ ! und zwischenspeichern
REPEAT
@slot_taste_lesen
slot$=slot1$+slot$ ! Einerstelle dazuaddieren
IF slot$>"25"
@nachricht_lÖschen
TEXT 10,248,"Slot # nicht grösser als 25 ! "
ELSE
TEXT 210,130,slot$ ! Angewählten Slot ausgeben
ENDIF
UNTIL slot$>="00" AND slot$<"26"
slot|=VAL(slot$) ! Zum aktuellen Slot machen
SPRITE #6,ani_spr$(slot|) ! Im Sprite
@sprite_in_raster ! und im Malraster darstellen
RETURN
> PROCEDURE roll_r
LOCAL zeile|
' Sprite zum Bearbeiten holen...
BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
' ROR die einzelnen Worte (wegen Farben) aufgeteilt in obere + untere 16 Bits
' CARD wegen der Besonderheit des ROR&
' (Kopiert Bit 15 in Bits 16 bis 31!)
FOR zeile|=0 TO 31
' Oberes Wort + Unteres Wort
spr_zeile%(zeile|)=SWAP(CARD(ROR&(SWAP(spr_zeile%(zeile|)),1)))+CARD(ROR&(spr_zeile%(zeile|),1))
NEXT zeile|
' Und in den aktuellen Sprite kopieren:
BMOVE V:spr_zeile%(0),V:ani_spr$(slot|),128
' Darstellen und ins Raster:
SPRITE #6,ani_spr$(slot|)
@sprite_in_raster
RETURN
> PROCEDURE roll_l
LOCAL zeile|
BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
' ROL wird genauso behandelt wie ROR (siehe dort...)
FOR zeile|=0 TO 31
spr_zeile%(zeile|)=SWAP(CARD(ROL&(SWAP(spr_zeile%(zeile|)),1)))+CARD(ROL&(spr_zeile%(zeile|),1))
NEXT zeile|
BMOVE V:spr_zeile%(0),V:ani_spr$(slot|),128
SPRITE #6,ani_spr$(slot|)
@sprite_in_raster
RETURN
' Unter-Prozeduren aus menu_rechts und menu_links
> PROCEDURE disk(dk!)
' Da die Sprites eventuell im FILESELECT-Requester stehen können werden sie unten rechts versteckt:
SPRITE #2,319,256
SPRITE #3,319,256
SPRITE #4,319,256
SPRITE #6,319,256
' Jetzt wird das dk!-Flag getestet, ob geladen oder gespeichert werden soll:
IF dk!
' Die DO-LOOP Schleife ist nur für das EXIT IF TRUE, damit bei
' FILESELECT-Abbruch sowie bei Irrtum-Wahl abgebrochen werden kann
DO
FILESELECT "Sprite Laden (.SPR)","Laden",":",datei$
IF RIGHT$(datei$,4)<>".SPR" OR datei$="" OR RIGHT$(datei$)=":"
@nachricht_lÖschen
TEXT 10,248,"KEINE SPRITE DATEI!"
' Raus bei Irrtum
EXIT IF TRUE
ENDIF
'
' Farbtabelle laden
OPEN "I",#1,datei$+"C"
FOR aktive|=0 TO 2
INPUT #1,color&(aktive|)
@aktuellefarbe
NEXT aktive|
CLOSE #1
CLR aktive|
' Radio-Button setzen
@zeig_farbboxwahl(aktive|)
' Farb-Slider für aktive Farbe richtig setzen (versteckte Sprites
' wieder auf die richtige Position bringen
@slidersetzen ! Slider auf Farbe0 setzen
'
' Sprite-Daten laden
OPEN "I",#1,datei$
FOR i|=0 TO PRED(DIM?(ani_spr$()))
ani_spr$(i|)=INPUT$(128,#1)
NEXT i|
CLOSE #1
'
' Den nullten Sprite aktivieren und ins Spritefenster setzen
' sowie die neue Slot-Nummer bekanntgeben
CLR slot|
TEXT 210,130," "
TEXT 210,130,slot|
SPRITE #6,ani_spr$(slot|)
VSYNC
' Versteckte Sprites wieder richtig positionieren:
SPRITE #6,210,31
' Und im Malraster den aktuellen Ausschnitt darstellen
@sprite_in_raster
' Nachricht schicken, daß alles ok und fertig ist
@nachricht_lÖschen
TEXT 10,248,"Geladen wurde "+datei$
LOOP UNTIL TRUE ! Auf jeden Fall raus
ELSE ! Speicher-Flag?
DO
FILESELECT "Sprite Speichern","Speichern",":",datei$
IF datei$="" OR RIGHT$(datei$)=":"
@nachricht_lÖschen
TEXT 10,248,"SPRITES NICHT GESPEICHERT !"
EXIT IF TRUE
ELSE IF RIGHT$(datei$,4)<>".SPR"
datei$=datei$+".SPR"
ENDIF
'
' Farben Speichern mit Extension 'SPRC'
OPEN "O",#1,datei$+"C"
FOR i|=0 TO 2
PRINT #1,color&(i|)
NEXT i|
CLOSE #1
'
' Sprite-Sequenz als gesamtes Speichern
OPEN "O",#1,datei$
FOR i|=0 TO PRED(DIM?(ani_spr$()))
PRINT #1,ani_spr$(i|);
NEXT i|
CLOSE #1
'
' OK Nachricht ausgeben:
@nachricht_lÖschen
TEXT 10,248,"Gespeichert in "+datei$
' Jetzt werden alle versteckten Sprites wieder
' auf die richtige Position gesetzt:
@slidersetzen
SPRITE #6,210,31
' Auf jeden Fall rauskommen...
LOOP UNTIL TRUE
ENDIF
RETURN
> PROCEDURE sprite_copy
@nachricht_lÖschen
' Soll ein SPrite aus oder in den Buffer kopiert werden ?
TEXT 10,248,"COPY SPRITE (IN) ODER (AUS) BUFFER"
' Um eine Reaktion erwarten zu können, eine Pause:
PAUSE 8
' und warten auf Mausklick:
REPEAT
UNTIL MOUSEK
' Dann verzweige erst auf, in oder aus:
IF MOUSEX>110 AND MOUSEX<135
@nachricht_lÖschen
TEXT 10,248,"SPRITE # IM BUFFER ! "
' OK, dann kopiere aktuellen Sprite in Buffer:
copybuffer$=ani_spr$(slot|)
flag!=TRUE!
' Und teile es dem Benutzer mit:
TEXT 78,248,slot|
ELSE IF MOUSEX>190 AND MOUSEX<223
@nachricht_lÖschen
' Kopiere Buffer in den aktuellen Sprite
ani_spr$(slot|)=copybuffer$
TEXT 10,248,"BUFFER NACH SPRITE # KOPIERT "
SPRITE #6,ani_spr$(slot|)
flag!=TRUE!
TEXT 175,248,slot|
' Und stelle es im Malraster dar:
@sprite_in_raster
' Abbruch durch RECHTE Maustaste oder durch falsches Anklicken:
ELSE IF MOUSEK=2 OR flag!=FALSE!
@nachricht_lÖschen
TEXT 10,248,"COPY ABGEBROCHEN!"
ENDIF
' flag! RESET:
flag!=FALSE!
RETURN
> PROCEDURE clear_sprite
' 15 Zeilen
FOR j|=0 TO 15
' und 15 Spalten des Malrasters
FOR i|=0 TO 15
' werden gelöscht:
PUT i|*8+11,j|*8+11,a$(0)
NEXT i|
' Jetzt wird die Spritezeile gelöscht und auf Null gesetzt
spr_zeile%(j|)=0
' Beide Wörter, darum:
spr_zeile%(j|+16)=0
' Und die Sprites:
edit_spr$(j|)=MKL$(0)
edit_spr$(j|+16)=MKL$(0)
NEXT j|
' Aktuellen Slot mit Nullen überschreiben und löschen:
ani_spr$(slot|)=STRING$(128,0)
' Dargestellten Sprite aktualisieren: als gelöschten (transparenten)
' Sprite darstellen
SPRITE #6,ani_spr$(slot|)
RETURN
> PROCEDURE animation
' Hier wird die Obergrenze festgelegt:
FOR i|=0 TO slot|
' Pause, damit der Benutzer den Wechsel verfolgen kann
PAUSE 1
TEXT 161,60," "
' Momentane Sequenznummer schreiben:
TEXT 161,60,i|
VSYNC
' Und darstellen:
SPRITE #6,ani_spr$(i|)
NEXT i|
' Nach Animate aktuellen Slot wieder bereitstellen
PAUSE 10
TEXT 161,60," "
SPRITE #6,ani_spr$(slot|)
RETURN
> PROCEDURE mirror
' Aktiven Sprite-Slot in das Zeilen-Langwort-Array kopieren
BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
' 32 Zeilen Spiegeln ...
FOR ypos|=0 TO 31
CLR spiegel%
' Der Spiegelroutine übergeben..
@spiegeln(ypos|)
spr_zeile%(ypos|)=spiegel%
' ... und in Sprite-Slot übergeben
NEXT ypos|
BMOVE V:spr_zeile%(0),V:ani_spr$(slot|),128
' in den Sprite-Slot darstellen
SPRITE #6,ani_spr$(slot|)
' den aktuellen Sprite-Ausschnitt in der Malbox zeichnen
@sprite_in_raster
RETURN
' Die Hilfs- und Unterroutinen
> PROCEDURE spiegeln(ypos|)
LOCAL i|,a%
' Spiegel-Zwischen-Variable löschen:
CLR spiegel%
' Aktuelle Spritezeile einer Hilfsvariablen übergeben
a%=spr_zeile%(ypos|)
' Wenn Bit gesetzt ist, setze es in
FOR i|=0 TO 15
IF BTST(a%,i|)
' .. der Langwortvariablen spiegelverkehrt
spiegel%=BSET(spiegel%,SUB(15,i|))
ENDIF
NEXT i|
FOR i|=16 TO 31
IF BTST(a%,i|)
' und diese Operation ebenfalls für das obere Datenwort
spiegel%=BSET(spiegel%,SUB(47,i|))
ENDIF
NEXT i|
' Und spiegel% enthält die korrekten Spritezeilen-Daten,
' um damit weiterzuarbeiten
RETURN
> PROCEDURE block_setzen(aktive|,ypos|,xpos|)
' Farbe oder löschen ?
IF lÖsch!
' Wenn gelöscht werden soll, setze durchsichtigen Block
PUT 11+xpos|*8,11+ypos|*8,a$(0)
ELSE
' Ansonsten die aktuelle Farbe
PUT 11+xpos|*8,11+ypos|*8,a$(aa%(aktive|))
ENDIF
RETURN
> PROCEDURE sprite_in_raster
' Vom Sprite-Slot$ nach 4Byte-Wert rüberschieben
' Sprite steht für die Bildwiedergabe jetzt in den Spritezeilen verkehrt
BMOVE V:ani_spr$(slot|),V:spr_zeile%(0),128
'
' Positionen der Bits und deren Farbwerte ermitteln
' Auch "scannen" genannt..
' 16 Zeilen bei 16 Spalten sind 256 Positionen
ii%=11 ! Rasterstartzeile
' Nur den aktuellen Spriteausschnitt darstellen:
FOR i|=z_start| TO 15+z_start|
jj%=11 ! Rasterstartspalte
s_zeile%=spr_zeile%(i|)
' Für Bildschirm-Darstellung spiegeln
@spiegeln(i|)
spr_zeile%(i|)=spiegel%
' Ist die zu bearbeitende Zeile leer (d.h. KEIN Bit gesetzt)?
IF s_zeile%
' Oberes Spritewort in zweite Hilfsvariable übernehmen:
s_tausch%=SWAP(s_zeile%)
FOR j|=15 DOWNTO 0
' Hier wird die aktuelle Farbe errechnet und gePUTet..
PUT jj%,ii%,a$(SUB(-BTST(s_zeile%,j|),2*BTST(s_tausch%,j|)))
' Nächste Rasterposition in der Zeile:
ADD jj%,8
NEXT j|
ELSE
' Hier wird die Zeile mit der Hintergrundfarbe gefüllt:
' also im Sprite KEIN BIT gesetzt (transparent)
FOR j|=0 TO 15
PUT jj%+j|*8,ii%,a$(0)
NEXT j|
ENDIF
ADD ii%,8 ! Nächste Rasterzeile
NEXT i|
RETURN
> PROCEDURE aktuellefarbe
' Aktuelle Farbe in angewählte Box setzen ...
' SETCOLOR in Farbe 5,6, oder 7...
SETCOLOR ADD(5,aktive|),color&(aktive|)
' Aktive, neu gesetzte Farbe aktivieren:
COLOR 5+aktive|,0
' Und Box mit neuer Farbe malen:
PBOX 80+aktive|*17,209,88+aktive|*17,216
' Farbe für alles andere wieder zurücksetzen
COLOR 1,0
' Neue Farbe ebenfalls dem Sprite mitteilen (SPRITE #6):
SETCOLOR (29+aktive|),(color&(aktive|))
RETURN
> PROCEDURE slidersetzen
' Farbwert ermitteln (X= AND mit max. möglichen Farbwert)
' Zum relativen Byte-Wert umrechnen (x1=SHR x,(R:8,G:4,B:0))
' dann Position anpassen in achter Schritten:
' x2=(x1*8)=(SHL x1,3) plus dem Slideranfang (+8)
' Die zusammengerechneten SHIFTungen ergeben für:
' Rot:SHR(x2,5); Grün:SHR(x2,1); Blau:SHL(x2,3)
' Zusammengefaßt werden diese Programmzeilen daraus:
rot_pos|=SHR(AND(color&(aktive|),&HF00),5)+8
grÜn_pos|=SHR(AND(color&(aktive|),&HF0),1)+8
blau_pos|=SHL(AND(color&(aktive|),&HF),3)+8
' Und die errechneten Slider-Positionen setzen
SPRITE #2,rot_pos|,152
SPRITE #3,grÜn_pos|,172
SPRITE #4,blau_pos|,192
RETURN
> PROCEDURE zeig_farbboxwahl(aktive|)
' Angewählte Box einrahmen bzw. Rahmen löschen
BOX 79+aktive|*17,208,89+aktive|*17,217
RETURN
> PROCEDURE slot_taste_lesen
DO
slot$=INKEY$
EXIT IF slot$<>"" AND slot$=>"0" AND slot$<"9"
LOOP
RETURN
> PROCEDURE nachricht_lÖschen
COLOR 0,1
PBOX 2,238,308,253
COLOR 1,0
RETURN
> PROCEDURE auss_rauf_runter
' In dieser Schleife bleiben, bis die Maustaste losgelassen wurde
DO WHILE MOUSEK=1
' Soll der Ausschnitt unter oder über dem alten sein?
IF ym%>ausy1|
ausschnitt!=TRUE!
@ausschnitt_box
TEXT 265,60," "
TEXT 265,60,z_start|
ELSE IF ym%<ausy|
ausschnitt!=FALSE!
@ausschnitt_box
TEXT 265,60," "
TEXT 265,60,z_start|
ENDIF
LOOP UNTIL MOUSEK<>1
' Neuen Ausschnitt dem Malraster übergeben
@sprite_in_raster
RETURN
> PROCEDURE ausschnitt_box
' Alte Ausschnittbox löschen
DEFLINE 0
BOX 208,ausy|,228,ausy1|
' Über oder unter dem alten Ausschnitt
IF ausschnitt!
' Im Erlaubten Maximal-Wert-Bereich ?
IF ausy1|<63
' OK, dann Zeiger und Boxkoordinaten hochzählen
INC ausy|
INC ausy1|
INC z_start|
ENDIF
ELSE
' Im erlaubten Minimal-Wert-Bereich ?
IF ausy|>29
' OK, dann Boxkoordinaten runterzählen
DEC ausy|
DEC ausy1|
DEC z_start|
ENDIF
ENDIF
' Dann neue Ausschnittbox malen
COLOR 1
DEFLINE 1
BOX 208,ausy|,228,ausy1|
RETURN